﻿package com.zouloux.ui 
{
	import com.greensock.TweenLite;
	import flash.display.Bitmap;
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.MouseEvent;
	import flash.geom.Matrix;
	import flash.net.URLRequest;
	import flash.system.ImageDecodingPolicy;
	import flash.system.LoaderContext;
	
	/**
	 * @author ZoulouX
	 */
	public class ImageLoader extends Sprite
	{
		/**
		 * Les types de resize
		 */
		public static const RESIZE_INSIDE		:String 		= "inside";
		public static const RESIZE_OUTSIDE		:String 		= "outside";
		public static const RESIZE_STRETCH		:String 		= "stretch";
		public static const RESIZE_NONE			:String 		= "none";
		
		/**
		 * Les dimensions
		 */
		protected var _width					:int;
		protected var _height					:int;
		
		/**
		 * L'id
		 */
		public var id							:uint;
		
		/**
		 * L'url
		 */
		public var url							:String					= "";
		
		/**
		 * Le loader
		 */
		protected var _loader					:Loader;
		
		/**
		 * Le type de redimentionnement
		 */
		protected var _resizeType				:String					= "inside";
		
		/**
		 * Si on doit lisser l'image
		 */
		protected var _smooth					:Boolean				= true;
		
		/**
		 * Si on doit faire une animation à la fin du chargement
		 */
		protected var _tweenOnComplete			:Boolean				= true;
		
		/**
		 * Le type de redimentionnement
		 */
		public function get resizeType ():String { return _resizeType; }
		public function set resizeType (value:String):void
		{
			_resizeType = value;
		}
		
		/**
		 * Lisser
		 */
		public function get smooth ():Boolean { return _smooth; }
		public function set smooth (value:Boolean):void 
		{
			_smooth = value;
		}
		
		/**
		 * Animer une fois chargé
		 */
		public function get tweenOnComplete ():Boolean { return _tweenOnComplete; }
		public function set tweenOnComplete (value:Boolean):void 
		{
			_tweenOnComplete = value;
		}
		
		
		// Le constructeur
		public function ImageLoader (width:int = 50, height:int = 50, url:String = null)
		{
			// Enregistrer les dimentions
			_width = width;
			_height = height;
			
			// Si une URL est passée en paramètre, alors charger l'image
			if (url != null)
				load(url);
		}
		
		// La méthode pour charger le visuel
		public function load (pUrl:String = null):void
		{
			if (pUrl == null || pUrl == "")
				pUrl = url
			
			// Créer le loader
			_loader = new Loader();
			
			//var contextLoader:LoaderContext = new LoaderContext(false, null, null);
			
			try
			{
				//contextLoader.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD;	
			}
			catch (e:Error) { };
			
			// Et charger
			//_loader.load(new URLRequest(pUrl), contextLoader);
			_loader.load(new URLRequest(pUrl));
			
			// Ajouter les écouteur
			_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
			_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loadErrorHandler);
		}
		
		// Chargement réussi
		protected function loadCompleteHandler (e:Event):void
		{
			// Cibler le bitmap
			var bitmap:Bitmap = Bitmap(_loader.content);
			
			// Redimentionner cette image
			if (_resizeType == "inside")
			{
				// Redimentionner avec des bordures
				if (bitmap.width > _width)
				{
					bitmap.width = _width;
					bitmap.scaleY = bitmap.scaleX;
				}
				if (bitmap.height > _height)
				{
					bitmap.height = _height;
					bitmap.scaleX = bitmap.scaleY;
				}
			}
			else if (_resizeType == "outside")
			{
				// Redimentionner sans bordures
				if (bitmap.width < _width)
				{
					bitmap.width = _width;
					bitmap.scaleY = bitmap.scaleX;
				}
				if (bitmap.height < _height)
				{
					bitmap.height = _height;
					bitmap.scaleX = bitmap.scaleY;
				}
			}
			else if (_resizeType == "stretch")
			{
				// Coller directement
				bitmap.width = _width;
				bitmap.height = _height;
			}
			
			// Centrer l'image
			if (_resizeType == "inside" || _resizeType == "outside" || _resizeType == "center")
			{
				bitmap.x = _width / 2 - bitmap.width / 2;
				bitmap.y = _height / 2 - bitmap.height / 2;
			}
			
			// Vérifier si on doit lisser ce bitmap
			bitmap.smoothing = _smooth;
			
			// Ajouter cette image
			addChildAt(bitmap, 0);
			
			// Faire la tween
			if (_tweenOnComplete)
			{
				// Faire l'animation
				TweenLite.from(bitmap, .4, {
					alpha: 0
				});
			}
			
			// Dispatcher l'event
			dispatchEvent(new Event(Event.COMPLETE));
		}
		
		// Erreur de chargement
		protected function loadErrorHandler (e:IOErrorEvent):void
		{
			trace("IMAGE LOAD ERROR");
			if (this.hasEventListener(IOErrorEvent.IO_ERROR))
				dispatchEvent(e);
		}
	}
}